#ifndef __407_MenuPort_H
#define __407_MenuPort_H

#ifdef __cplusplus
	extern "C" {
#endif

#include <stdio.h>
#include <stdlib.h>
#include "menu.h"
#include "main.h"
#include "stm32f407xx.h"
 
#include "cmsis_os2.h"
#include "FreeRTOSConfig.h"
#include "menu_config.h"

#ifdef MENU_INPUT_BUF_SIZE
#define Max_InputBuf_Size MENU_INPUT_BUF_SIZE
#else
#define Max_InputBuf_Size 256
#endif

enum menu_port_state{
    MENU_PORT_STATE_WAIT,
    MENU_PORT_STATE_START,
    MENU_PORT_STATE_INPUT,
    MENU_PORT_STATE_OUTPUT,
    MENU_PORT_STATE_IDLE,
    MENU_PORT_STATE_SAVE,
    MENU_PORT_STATE_STOP,
};

// typedef int (*menuport_output_function_type)(void *send_class,char *buf,uint32_t size);               //< 发送函数指针类型
// typedef int (*menuport_input_function_type)( char *buf,uint32_t size);               //< 发送函数指针类型
// typedef int (*menuport_output_cplt_function_type)( );               //< 发送函数指针类型
 
typedef int (*menuport_save_func_type)(struct menu *menu, struct config cfg);   //< 菜单数据保存到硬件
//  为菜单引入接口， 菜单本身应不包含接口，分层，功能单一原则
//  菜单状态
//  菜单接收输入开启， 
typedef struct   {
	struct menu *menu;
	volatile uint8_t state; 			//<   
	volatile uint8_t is_working; 			//<   1: working   0 :  none
	volatile uint16_t idle; 			//<   1: 
    void *obj_class;                               	//< send函数的第一个参数
	int (*output)(char *buf,uint32_t size);	//<  输出函数指针类型
	void (*input)( );               //< 输入函数指针类型
	int (*output_cplt)( );               //<    输出完成 函数指针类型
	int (*input_callback)(char *buf,uint32_t size);               //<    接收输入回调 函数指针类型
	int (*save)( );               //<    菜单数据保存到硬件 函数指针类型
	int (*get)( );               //<    菜单数据从硬件读出 函数指针类型
	int (*get_status)( );               //<    菜单数据从硬件读出 函数指针类型
	int (*set_status)(uint8_t status);               //<    菜单数据从硬件读出 函数指针类型
	uint8_t *rcv_buf;
	uint16_t rcv_size;
 
	// menuport_output_function_type output ;               /
	// menuport_input_function_type intput ;               //< 输入函数指针类型
	// menuport_output_cplt_function_type output_cplt ; 	//< 
	// menuport_save_func_type save;

	// UART_HandleTypeDef *huart;
	// GPIO_TypeDef *gpio;
	// uint16_t pin;
	// uint8_t mode; 		/*0 :232  1: 485*/
	// uint8_t trans_mode; /* 0 :polling, 1: IT  2: DMA*/

}MenuPort_TypeDef;
extern MenuPort_TypeDef my_menu_port;

/* 帮助menu_init 初始化 */
int * MenuPort_Init( );

int MenuPort_Get_Status(   );
void MenuPort_Set_Status( uint8_t status );

int MenuPort_Output( uint8_t * buf, uint32_t size);
int MenuPort_Output_Cplt( );
void MenuPort_Input(  );

int MenuPort_Input_Callback(uint8_t *buf, uint32_t size);
int MenuPort_Save(   );
int MenuPort_Get(   );

int MenuPort_Check_PassWord(   );



// /* menu_init 传入port_class port_send*/
// void MenuPort_Setup( MenuPort_t *menuport, UART_HandleTypeDef *huart, GPIO_TypeDef *GPIO, uint16_t pin, uint8_t mode ,uint8_t trans_mode);

// /* 待传入的函数 实际函数*/
// int MenuPort_Send(MenuPort_t *menuport,  uint8_t * buf, uint32_t size);


// /* 接收回调 */
// void Menuport_receive_callback(MenuPort_t *menuport, uint8_t *buf,uint32_t size);


// void Menuport_Error(char *error);

// void menuport_exit( MenuPort_t *menuport);

void menu_port( void *argument);

#ifdef __cplusplus
	}
#endif

#endif

